
/**
 * @Author: yuanmanxue
 * @Date:   2017-12-27 03:18:36
 * @Last modified by:   yuanmanxue
 * @Last modified time: 2018-01-11 03:09:33
 */

/*promise 错误捕获，catch全局捕获，reject局部捕获*/
// {
//   function ansyncFn(a,b) {
//     return new Promise((resolve,reject) => {
//       if(typeof a !== 'number' || typeof b !== 'number') {
//         reject(new Error('no number'))
//       }
//       resolve(a+b);
//     })
//   }
//   ansyncFn(1,2)
//   .then(function(result){
//     console.log(result);
//   },function(error){
//     console.log(error);
//   })
//   .catch(function(error){
//     console.log(error);
//   })
// }
// {
//   class User {
//     constructor(name,possword) {
//       this.name = name;
//       this.possword = possword;
//     }
//     validateName(){
//       let name = this.name;
//       return new Promise((resolve,reject) => {
//         setTimeout(function(){
//           if(name === 'yuan') {
//             resolve('success');
//           } else {
//             reject('error');
//           }
//         },200)
//       })
//     }
//
//     validatePossword(){
//       let possword = this.possword;
//       return new Promise((resolve,reject) => {
//         setTimeout(function(){
//           if(possword === '123') {
//             resolve('success');
//           } else {
//             reject('error');
//           }
//         },200)
//       })
//     }
//   }
//   const user = new User('yuan','123');
//   user.validateName()
//   .then(function(result){
//     return user.validatePossword()
//   })
//   .then(function(result){
//     console.log('validate success');
//   })
//   .catch(function(error){
//     console.log('validata error');
//   })
// }
{
  class User {
    constructor(name,possword) {
      this.name = name;
      this.possword = possword;
    }
    validateName(){
      let name = this.name;
      return new Promise((resolve,reject) => {
        setTimeout(function(){
          if(name === 'yuan') {
            resolve('success');
          } else {
            reject('error');
          }
        },200)
      })
    }
    validatePossword(){
      let possword = this.possword;
      return new Promise((resolve,reject) => {
        setTimeout(function(){
          if(possword === '123') {
            resolve('success');
          } else {
            reject('error');
          }
        },200)
      })
    }
  }
  // 错误捕获方式
  // 如果存在reject捕获就不需要catch捕获，如果没有reject捕获，catch可以捕获所有错误，
  // 如果在.then(reject(function(){这里 throw Error})) 这里的error只能有catch捕获，reject是捕获不到的
  const user = new User('yuan','1232');
  user.validateName()
  .then(function(result){
    throw new Error('first err');
  },function(error){
    console.log('second err');
  })
  .catch(function(error){
    console.log(error);
    return user.validatePossword();
  })
  .then(function(result){
    console.log(result);
  },function(error) {
    console.log(error);
  })
}

{
  function ansyncFn(a,b) {
    return new Promise((resolve,reject) => {
      if(typeof a !== 'number' || typeof b !== 'number') {
        reject(new Error('no number'))
      }
      resolve(a+b);
    })
  }
  let resultList = [];
  // ansyncFn(1,2)
  // .then(function(result){
  //   resultList.push(result);
  //   return ansyncFn(result,result+1)
  // })
  // .then(function(result) {
  //   resultList.push(result);
  //   console.log(resultList);
  // })
// promise 存在两个静态方法 all和race，all全部执行返回数组，race是返回最先执行完的，如果内部存在一个错误，都不会往下面执行
var promise = Promise.race([ansyncFn(1,2),ansyncFn(2,3),ansyncFn(2,3)])
.then(function(result){
  console.log(result);//3
})

}



// {
//   const promise = new Promise((resolve, reject) => {
//     console.log(1)
//     resolve();
//     console.log(2)
//   })
//   promise.then(() => {
//     console.log(3)
//   })
//   console.log(4)
// }
// {
  // const promise1 = new Promise((resolve, reject) => {
  //   setTimeout(() => {
  //     resolve('success')
  //   }, 1000)
  // })
  // const promise2 = promise1.then(() => {
  //   throw new Error('error!!!')
  // })
  //
  // console.log('promise1', promise1)
  // console.log('promise2', promise2)
  //
  // setTimeout(() => {
  //   console.log('promise1', promise1)
  //   console.log('promise2', promise2)
  // }, 2000)
// }
// {
  // const promise = new Promise((resolve, reject) => {
  //   setTimeout(() => {
  //     console.log('once')
  //     resolve('success')
  //   }, 1000)
  // })
  //
  // const start = Date.now();
  // promise.then((res) => {
  //   console.log(res, Date.now() - start)
  // })
  // promise.then((res) => {
  //   console.log(res, Date.now() - start)
  // })
// }
// {
//   Promise.resolve(new Error('error!!!'))
//   .then(() => {
//     new Error('error!!!')
//   })
//   .then((res) => {
//     console.log('then: ', res)
//   })
//   .catch((err) => {
//     console.log('catch: ', err)
//   })
// }
